package com.wifi.view;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;

import com.wifi.imp.OnToggleStateChangedListener;


public class ToggleView extends View {

	private Bitmap switchBackgroundBitmap; // 背景图片
	private Bitmap slideButtonBackgroundBitmap; // 滑动块的背景图片
	private boolean currentToggleState = false; // 滑动块当前的状态, 默认为: 关闭
	private int currentX; // x轴最新的偏移量
	private boolean isTouching = false; // 是否正在触摸中, 默认值: 未触摸

	private OnToggleStateChangedListener mOnToggleStateChangedListener;

	/**
	 * @param context
	 * @param attrs 里边封装了在布局文件中定义的所有属性
	 */
	public ToggleView(Context context, AttributeSet attrs) {
		super(context, attrs);

		// 自定义属性的命名空间
		String namespace = "http://schemas.android.com/apk/res-auto";

		// 取出自定义属性的值.

		// 1. 当前的状态
		currentToggleState = attrs.getAttributeBooleanValue(namespace, "currentState", false);
		currentToggleState=false;

		// 2. 取出背景图片的id
		int switchBackgroundID = attrs.getAttributeResourceValue(namespace, "switchBackgroundID", -1);
		setSwitchBackgroundID(switchBackgroundID);

		// 3. 取出滑动块图片的id
		int slideButtonBackgroundID = attrs.getAttributeResourceValue(namespace, "slideButtonBackgroundID", -1);
		setSlideButtonBackgroundID(slideButtonBackgroundID);
	}

	/**
	 * 当android系统需要测量此控件时, 回调此方法.
	 */
	@Override
	protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
		super.onMeasure(widthMeasureSpec, heightMeasureSpec);

		// 自己设置控件的宽和高, 采用背景图片的宽和高来设置.
		setMeasuredDimension(switchBackgroundBitmap.getWidth(), switchBackgroundBitmap.getHeight());
//		setMeasuredDimension(widthMeasureSpec,heightMeasureSpec);
	}

	/**
	 * 当android系统需要绘制此控件时, 回调此方法
	 * canvas 画画板
	 */
	@Override
	protected void onDraw(Canvas canvas) {
		// 1. 把背景图片画到控件的左上角上.
		canvas.drawBitmap(switchBackgroundBitmap, 0, 0, null); // 把背景图片画在控件的左上角

		// 2. 把滑动块画在指定的位置上, 根据状态来绘制它的位置.

		// 打卡状态的左边界的x轴地址
		int left = switchBackgroundBitmap.getWidth() - slideButtonBackgroundBitmap.getWidth();

		if(isTouching) {
			// 当前手指正在触摸中, 根据当前的x轴的位置绘制滑动块的位置.

			// 正在滑动中的滑动块的左边的值
			int slidingLeft = currentX - slideButtonBackgroundBitmap.getWidth() / 2;

			if(slidingLeft < 0) {
				// 超出了左边界, 一直赋值为0
				slidingLeft = 0;
			} else if(slidingLeft > left) { // 如果当前的滑动块的左边 大于了 背景图片宽度 - 滑动块宽度 , 超出了边界.
				slidingLeft = left;
			}

			canvas.drawBitmap(slideButtonBackgroundBitmap, slidingLeft, 0, null);
		} else {
			// 没有触摸滑动块, 根据currentToggleState的状态绘制滑动块的位置
			if(currentToggleState) {
				// 当前是打开的状态: top=0, left=背景图片的宽度 - 滑动块的宽度
				canvas.drawBitmap(slideButtonBackgroundBitmap, left, 0, null);
			} else {
				// 当前是关闭的状态: top=0, left=0
				canvas.drawBitmap(slideButtonBackgroundBitmap, 0, 0, null);
			}
		}
	}

	public boolean touchAble=true;
	public void setTouchAble(boolean touchAble){
		this.touchAble=touchAble;
	}

	/**
	 * 当手指触摸时出发此方法
	 * 按下, 移动, 抬起. 三种事件类型
	 */
	@Override
	public boolean onTouchEvent(MotionEvent event) {

		if(touchAble){
			switch (event.getAction()) {
				case MotionEvent.ACTION_DOWN: // 按下的事件
					isTouching = true;
					currentX = (int) event.getX();
					break;
				case MotionEvent.ACTION_MOVE: // 移动的事件
					currentX = (int) event.getX();
					break;
				case MotionEvent.ACTION_UP: // 抬起的事件
					isTouching = false;
					currentX = (int) event.getX();

					// 背景的中心点, 当前的x轴的偏移量
					boolean state = currentX > (switchBackgroundBitmap.getWidth() / 2);

					// 回调用户的事件
					if(state != currentToggleState && mOnToggleStateChangedListener != null) {
						mOnToggleStateChangedListener.onToggleStateChanged(state);
					}

					currentToggleState = state;
					break;
				default:
					break;
			}
			invalidate(); // 刷新当前控件, 引起onDraw方法的调用.
		}
		return true; // 消耗掉此事件


	}

	/**
	 * alt + shift + J
	 * 设置开关的状态
	 * @param b
	 */
	public void setCurrentToggleState(boolean b) {
		currentToggleState  = b;
	}

	/**
	 * 设置开关背景的id
	 * @param switchBackground
	 */
	public void setSwitchBackgroundID(int switchBackground) {
		switchBackgroundBitmap = BitmapFactory.decodeResource(getResources(), switchBackground);
	}

	/**
	 * 设置滑动块的背景
	 * @param slideButtonBackground
	 */
	public void setSlideButtonBackgroundID(int slideButtonBackground) {
		slideButtonBackgroundBitmap = BitmapFactory.decodeResource(getResources(), slideButtonBackground);
	}

	public void setOnToggleStateChangedListener(OnToggleStateChangedListener listener) {
		mOnToggleStateChangedListener = listener;
	}
}
